{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Quickly solving Kepler's Problem in Python using numba"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Introduction\n",
    "\n",
    "*In this notebook we will prove how using **numba** we can achieve almost native performance using solely the Python programming language. We will implement an algorithm to solve Kepler's problem running a standard Newton-Raphson iteration on the Kepler's equation, hence following the approach of Bate & Mueller and Vallado. We will run benchmarks against the Vallado Fortran version, available on the Internet and wrapped in poliastro 0.2.*\n",
    "\n",
    "**Author**: Juan Luis Cano Rodríguez <juanlu@pybonacci.org> (<a href=\"http://es.linkedin.com/in/juanluiscanor/en\">LinkedIn</a>)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-info\">For executing this notebook you will need to use the branch `idea-numba` of the poliastro repository: https://github.com/Pybonacci/poliastro/tree/idea-numba</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Fortran version"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from astropy import units as u\n",
    "\n",
    "from poliastro.bodies import Earth\n",
    "from poliastro.twobody import State, propagation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "k = Earth.k\n",
    "r0 = [1131.340, -2282.343, 6672.423] * u.km\n",
    "v0 = [-5.64305, 4.30333, 2.42879] * u.km / u.s\n",
    "tof = 40 * u.min"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$[1131.34,~-2282.343,~6672.423] \\; \\mathrm{km}$"
      ],
      "text/plain": [
       "<Quantity [ 1131.34 ,-2282.343, 6672.423] km>"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$[-5.64305,~4.30333,~2.42879] \\; \\mathrm{\\frac{km}{s}}$"
      ],
      "text/plain": [
       "<Quantity [-5.64305, 4.30333, 2.42879] km / s>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "v0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$398600 \\; \\mathrm{\\frac{km^{3}}{s^{2}}}$"
      ],
      "text/plain": [
       "<Quantity 398600.0 km3 / s2>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "k"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$40 \\; \\mathrm{min}$"
      ],
      "text/plain": [
       "<Quantity 40.0 min>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "tof"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "r, v = propagation.kepler(k.to(u.km**3 / u.s**2).value,\n",
    "                          r0.to(u.km).value,\n",
    "                          v0.to(u.km / u.s).value,\n",
    "                          tof.to(u.s).value)\n",
    "r *= u.km\n",
    "v *= u.km / u.s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$[-4219.7762,~4363.0457,~-3958.7497] \\; \\mathrm{km}$"
      ],
      "text/plain": [
       "<Quantity [-4219.77617109, 4363.04569716,-3958.74972246] km>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$[3.6898377,~-1.9167093,~-6.1125185] \\; \\mathrm{\\frac{km}{s}}$"
      ],
      "text/plain": [
       "<Quantity [ 3.68983773,-1.91670933,-6.11251847] km / s>"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "v"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Prepare the inputs to measure performance:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "k_ = k.to(u.km**3 / u.s**2).value\n",
    "r0_ = r0.to(u.km).value\n",
    "v0_ = v0.to(u.km / u.s).value\n",
    "tof_ = tof.to(u.s).value"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The slowest run took 9.87 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 10.5 µs per loop\n"
     ]
    }
   ],
   "source": [
    "%timeit propagation.kepler(k_, r0_, v0_, tof_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Pure Python version\n",
    "\n",
    "Now we write our own implementation in pure Python. We will use numbified $c_2$ and $c_3$ functions for the moment."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "from poliastro.stumpff import c2, c3\n",
    "\n",
    "def kepler_py(k, r0, v0, tof):\n",
    "    # Prepare input\n",
    "    r0 = np.asarray(r0).astype(np.float)\n",
    "    v0 = np.asarray(v0).astype(np.float)\n",
    "    tof = float(tof)\n",
    "    assert r0.shape == (3,)\n",
    "    assert v0.shape == (3,)\n",
    "\n",
    "    # Cache some results\n",
    "    dot_r0v0 = np.dot(r0, v0)\n",
    "    norm_r0 = np.linalg.norm(r0)\n",
    "    sqrt_mu = np.sqrt(k)\n",
    "    alpha = -np.dot(v0, v0) / k + 2 / norm_r0\n",
    "\n",
    "    # Newton-Raphson iteration on the Kepler equation\n",
    "    # Conservative initial guess\n",
    "    xi = sqrt_mu * tof / norm_r0\n",
    "    numiter = 50\n",
    "    count = 0\n",
    "    while count < numiter:\n",
    "        psi = xi**2 * alpha\n",
    "        norm_r = xi**2 * c2(psi) + dot_r0v0 / sqrt_mu * xi * (1 - psi * c3(psi)) + norm_r0 * (1 - psi * c2(psi))\n",
    "        xi_new = xi + (sqrt_mu * tof - xi**3 * c3(psi) - dot_r0v0 / sqrt_mu * xi**2 * c2(psi) -\n",
    "                       norm_r0 * xi * (1 - psi * c3(psi))) / norm_r\n",
    "        err = np.abs((xi_new - xi) / xi_new)\n",
    "        if err < 1e-10:\n",
    "            break\n",
    "        else:\n",
    "            xi = xi_new\n",
    "            count += 1\n",
    "    else:\n",
    "        print(\"No convergence\")\n",
    "        return\n",
    "\n",
    "    # Compute Lagrange coefficients\n",
    "    f = 1 - xi**2 / norm_r0 * c2(psi)\n",
    "    g = tof - xi**3 / sqrt_mu * c3(psi)\n",
    "\n",
    "    gdot = 1 - xi**2 / norm_r * c2(psi)\n",
    "    fdot = sqrt_mu / (norm_r * norm_r0) * xi * (psi * c3(psi) - 1)\n",
    "\n",
    "    # Return position and velocity vectors\n",
    "    r = f * r0 + g * v0\n",
    "    v = fdot * r0 + gdot * v0\n",
    "\n",
    "    assert np.abs(f * gdot - fdot * g - 1) < 1e-6\n",
    "\n",
    "    return r, v"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "r_py, v_py = kepler_py(k_, r0_, v0_, tof_)\n",
    "r_py *= u.km\n",
    "v_py *= u.km / u.s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.testing.assert_array_almost_equal(r_py.value, r.value)\n",
    "np.testing.assert_array_almost_equal(v_py.value, v.value)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$[-4219.7762,~4363.0457,~-3958.7497] \\; \\mathrm{km}$"
      ],
      "text/plain": [
       "<Quantity [-4219.77617109, 4363.04569716,-3958.74972246] km>"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r_py"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The slowest run took 7.80 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "10000 loops, best of 3: 69.9 µs per loop\n"
     ]
    }
   ],
   "source": [
    "%timeit kepler_py(k_, r0_, v0_, tof_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "100000 loops, best of 3: 11 µs per loop\n"
     ]
    }
   ],
   "source": [
    "%timeit propagation.kepler(k_, r0_, v0_, tof_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Our pure Python, non optimized version **is not *that* bad**! It stays in the same order of magnitude as the Fortran version for elliptic orbits at least. Let us see how can we improve the results."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "%load_ext line_profiler"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "%lprun -f kepler_py kepler_py(k_, r0_, v0_, tof_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "According to line_profiler, 13 % of the time is spent in the two `asarray` calls and 14.5 % in the single `norm` computation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The slowest run took 13.55 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 7.96 µs per loop\n"
     ]
    }
   ],
   "source": [
    "%timeit np.linalg.norm(r0_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The slowest run took 14.04 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 2.23 µs per loop\n"
     ]
    }
   ],
   "source": [
    "%timeit np.sqrt(np.dot(r0_, r0_))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can try and replace `linalg.norm` with the square root of the dot product. We can go further and assume the input are float arrays to save some more microseconds."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def kepler_py2(k, r0, v0, tof):\n",
    "    # Algorithm parameters\n",
    "    rtol = 1e-10\n",
    "    numiter = 50\n",
    "    \n",
    "    # Cache some results\n",
    "    dot_r0v0 = np.dot(r0, v0)\n",
    "    norm_r0 = np.sqrt(np.dot(r0, r0))\n",
    "    sqrt_mu = np.sqrt(k)\n",
    "    alpha = -np.dot(v0, v0) / k + 2 / norm_r0\n",
    "\n",
    "    # Newton-Raphson iteration on the Kepler equation\n",
    "    # Conservative initial guess\n",
    "    xi = sqrt_mu * tof / norm_r0\n",
    "    count = 0\n",
    "    while count < numiter:\n",
    "        psi = xi * xi * alpha\n",
    "        c2_psi = c2(psi)\n",
    "        c3_psi = c3(psi)\n",
    "        norm_r = xi * xi * c2_psi + dot_r0v0 / sqrt_mu * xi * (1 - psi * c3_psi) + norm_r0 * (1 - psi * c2_psi)\n",
    "        xi_new = xi + (sqrt_mu * tof - xi * xi * xi * c3_psi - dot_r0v0 / sqrt_mu * xi * xi * c2_psi -\n",
    "                       norm_r0 * xi * (1 - psi * c3_psi)) / norm_r\n",
    "        if abs((xi_new - xi) / xi_new) < rtol:\n",
    "            break\n",
    "        else:\n",
    "            xi = xi_new\n",
    "            count += 1\n",
    "    else:\n",
    "        raise RuntimeError(\"Convergence could not be achieved under \"\n",
    "                           \"%d iterations\" % numiter)\n",
    "\n",
    "    # Compute Lagrange coefficients\n",
    "    f = 1 - xi**2 / norm_r0 * c2_psi\n",
    "    g = tof - xi**3 / sqrt_mu * c3_psi\n",
    "\n",
    "    gdot = 1 - xi**2 / norm_r * c2_psi\n",
    "    fdot = sqrt_mu / (norm_r * norm_r0) * xi * (psi * c3_psi - 1)\n",
    "\n",
    "    # Return position and velocity vectors\n",
    "    r = f * r0 + g * v0\n",
    "    v = fdot * r0 + gdot * v0\n",
    "\n",
    "    assert np.abs(f * gdot - fdot * g - 1) < rtol\n",
    "\n",
    "    return r, v"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "r_py2, v_py2 = kepler_py2(k_, r0_, v0_, tof_)\n",
    "r_py2 *= u.km\n",
    "v_py2 *= u.km / u.s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.testing.assert_array_almost_equal(r_py2.value, r.value)\n",
    "np.testing.assert_array_almost_equal(v_py2.value, v.value)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "10000 loops, best of 3: 36.1 µs per loop\n"
     ]
    }
   ],
   "source": [
    "%timeit kepler_py2(k_, r0_, v0_, tof_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Optimized Python + numba version\n",
    "\n",
    "We cut the time in half! We still have another bullet: numba. This will require some work though, because we will have to provide some work arrays from outside to use the functions `np.abs` and `np.dot`, and in particular the latest one is not available. On the other hand, we will have to provide a better initial guess to achieve reasonable speed for hyperbolic orbits too."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numba\n",
    "\n",
    "def kepler_numba(k, r0, v0, tof, numiter=35, rtol=1e-10):\n",
    "    \"\"\"Propagates Keplerian orbit.\n",
    "\n",
    "    Parameters\n",
    "    ----------\n",
    "    k : float\n",
    "        Gravitational constant of main attractor (km^3 / s^2).\n",
    "    r0 : array\n",
    "        Initial position (km).\n",
    "    v0 : array\n",
    "        Initial velocity (km).\n",
    "    tof : float\n",
    "        Time of flight (s).\n",
    "    numiter : int, optional\n",
    "        Maximum number of iterations, default to 35.\n",
    "    rtol : float, optional\n",
    "        Maximum relative error permitted, default to 1e-10.\n",
    "\n",
    "    Raises\n",
    "    ------\n",
    "    RuntimeError\n",
    "        If the algorithm didn't converge.\n",
    "\n",
    "    Notes\n",
    "    -----\n",
    "    This algorithm is based on Vallado implementation, and does basic Newton\n",
    "    iteration on the Kepler equation written using universal variables. Battin\n",
    "    claims his algorithm uses the same amount of memory but is between 40 %\n",
    "    and 85 % faster.\n",
    "\n",
    "    \"\"\"\n",
    "    # Compute Lagrange coefficients\n",
    "    try:\n",
    "        f, g, fdot, gdot = _kepler(k, r0, v0, tof, numiter, rtol)\n",
    "    except RuntimeError:\n",
    "        raise RuntimeError(\"Convergence could not be achieved under \"\n",
    "                           \"%d iterations\" % numiter)\n",
    "\n",
    "    assert np.abs(f * gdot - fdot * g - 1) < 1e-5  # Fixed tolerance\n",
    "\n",
    "    # Return position and velocity vectors\n",
    "    r = f * r0 + g * v0\n",
    "    v = fdot * r0 + gdot * v0\n",
    "\n",
    "    return r, v\n",
    "\n",
    "@numba.njit('f8(f8[:], f8[:])')\n",
    "def dot(u, v):\n",
    "    dp = 0.0\n",
    "    for ii in range(u.shape[0]):\n",
    "        dp += u[ii] * v[ii]\n",
    "    return dp\n",
    "\n",
    "@numba.njit\n",
    "def _kepler(k, r0, v0, tof, numiter, rtol):\n",
    "    # Cache some results\n",
    "    dot_r0v0 = dot(r0, v0)\n",
    "    norm_r0 = dot(r0, r0) ** .5\n",
    "    sqrt_mu = k**.5\n",
    "    alpha = -dot(v0, v0) / k + 2 / norm_r0\n",
    "\n",
    "    # First guess\n",
    "    if alpha > 0:\n",
    "        # Elliptic orbit\n",
    "        xi_new = sqrt_mu * tof * alpha\n",
    "    elif alpha < 0:\n",
    "        # Hyperbolic orbit\n",
    "        xi_new = (np.sign(tof) * (-1 / alpha)**.5 *\n",
    "                  np.log((-2 * k * alpha * tof) / (dot_r0v0 + np.sign(tof) * np.sqrt(-k / alpha) * (1 - norm_r0 * alpha))))\n",
    "\n",
    "    # Newton-Raphson iteration on the Kepler equation\n",
    "    count = 0\n",
    "    while count < numiter:\n",
    "        xi = xi_new\n",
    "        psi = xi * xi * alpha\n",
    "        c2_psi = c2(psi)\n",
    "        c3_psi = c3(psi)\n",
    "        norm_r = xi * xi * c2_psi + dot_r0v0 / sqrt_mu * xi * (1 - psi * c3_psi) + norm_r0 * (1 - psi * c2_psi)\n",
    "        xi_new = xi + (sqrt_mu * tof - xi * xi * xi * c3_psi - dot_r0v0 / sqrt_mu * xi * xi * c2_psi -\n",
    "                       norm_r0 * xi * (1 - psi * c3_psi)) / norm_r\n",
    "        if abs((xi_new - xi) / xi_new) < rtol:\n",
    "            break\n",
    "        else:\n",
    "            count += 1\n",
    "    else:\n",
    "        raise RuntimeError\n",
    "\n",
    "    # Compute Lagrange coefficients\n",
    "    f = 1 - xi**2 / norm_r0 * c2_psi\n",
    "    g = tof - xi**3 / sqrt_mu * c3_psi\n",
    "\n",
    "    gdot = 1 - xi**2 / norm_r * c2_psi\n",
    "    fdot = sqrt_mu / (norm_r * norm_r0) * xi * (psi * c3_psi - 1)\n",
    "\n",
    "    return f, g, fdot, gdot"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And we provide a Python version of the final function for benchmarking too:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def kepler_python_final(k, r0, v0, tof, numiter=35, rtol=1e-10):\n",
    "    # Cache some results\n",
    "    dot_r0v0 = np.dot(r0, v0)\n",
    "    norm_r0 = np.dot(r0, r0) ** .5\n",
    "    sqrt_mu = k**.5\n",
    "    alpha = -np.dot(v0, v0) / k + 2 / norm_r0\n",
    "\n",
    "    # First guess\n",
    "    if alpha > 0:\n",
    "        # Elliptic orbit\n",
    "        xi_new = sqrt_mu * tof * alpha\n",
    "    elif alpha < 0:\n",
    "        # Hyperbolic orbit\n",
    "        xi_new = (np.sign(tof) * (-1 / alpha)**.5 *\n",
    "                  np.log((-2 * k * alpha * tof) / (dot_r0v0 + np.sign(tof) * np.sqrt(-k / alpha) * (1 - norm_r0 * alpha))))\n",
    "\n",
    "    # Newton-Raphson iteration on the Kepler equation\n",
    "    count = 0\n",
    "    while count < numiter:\n",
    "        xi = xi_new\n",
    "        psi = xi * xi * alpha\n",
    "        c2_psi = c2(psi)\n",
    "        c3_psi = c3(psi)\n",
    "        norm_r = xi * xi * c2_psi + dot_r0v0 / sqrt_mu * xi * (1 - psi * c3_psi) + norm_r0 * (1 - psi * c2_psi)\n",
    "        xi_new = xi + (sqrt_mu * tof - xi * xi * xi * c3_psi - dot_r0v0 / sqrt_mu * xi * xi * c2_psi -\n",
    "                       norm_r0 * xi * (1 - psi * c3_psi)) / norm_r\n",
    "        if abs((xi_new - xi) / xi_new) < rtol:\n",
    "            break\n",
    "        else:\n",
    "            count += 1\n",
    "    else:\n",
    "        raise RuntimeError(\"Convergence could not be achieved under \"\n",
    "                           \"%d iterations\" % numiter)\n",
    "\n",
    "    # Compute Lagrange coefficients\n",
    "    f = 1 - xi**2 / norm_r0 * c2_psi\n",
    "    g = tof - xi**3 / sqrt_mu * c3_psi\n",
    "\n",
    "    gdot = 1 - xi**2 / norm_r * c2_psi\n",
    "    fdot = sqrt_mu / (norm_r * norm_r0) * xi * (psi * c3_psi - 1)\n",
    "\n",
    "    assert np.abs(f * gdot - fdot * g - 1) < 1e-5  # Fixed tolerance\n",
    "\n",
    "    # Return position and velocity vectors\n",
    "    r = f * r0 + g * v0\n",
    "    v = fdot * r0 + gdot * v0\n",
    "\n",
    "    return r, v"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "r_numba, v_numba = kepler_numba(k_, r0_, v0_, tof_)\n",
    "r_numba *= u.km\n",
    "v_numba *= u.km / u.s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.testing.assert_array_almost_equal(r_numba.value, r.value)\n",
    "np.testing.assert_array_almost_equal(v_numba.value, v.value)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$[-4219.7762,~4363.0457,~-3958.7497] \\; \\mathrm{km}$"
      ],
      "text/plain": [
       "<Quantity [-4219.77617109, 4363.04569716,-3958.74972246] km>"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "r_numba"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/latex": [
       "$[3.6898377,~-1.9167093,~-6.1125185] \\; \\mathrm{\\frac{km}{s}}$"
      ],
      "text/plain": [
       "<Quantity [ 3.68983773,-1.91670933,-6.11251847] km / s>"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "v_numba"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The slowest run took 11.71 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 11.9 µs per loop\n"
     ]
    }
   ],
   "source": [
    "%timeit kepler_numba(k_, r0_, v0_, tof_)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**We achieved a 0.9x factor with the pure Python version**: the results are promising!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Benchmark\n",
    "\n",
    "We will cover a range of values of eccentricity to compare both versions, plotting computation time vs time of flight."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from poliastro.twobody import State\n",
    "from poliastro.plotting import plot"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Elliptic orbit"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[  2400.           5531.82615614   8663.65231228  11795.47846841\n",
      "  14927.30462455  18059.13078069  21190.95693683  24322.78309297]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7fde79020b00>,\n",
       " <matplotlib.lines.Line2D at 0x7fde78fb0748>]"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\nOrMAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fde79038d30>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ss = State.from_vectors(Earth, r0, v0)\n",
    "tof_range = np.linspace(tof.to(u.s).value,\n",
    "                        (ss.period * 4).to(u.s).value,\n",
    "                        num=8)\n",
    "print(tof_range)\n",
    "plot(ss)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The slowest run took 4.69 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 11 µs per loop\n",
      "100000 loops, best of 3: 12.7 µs per loop\n",
      "10000 loops, best of 3: 33.8 µs per loop\n",
      "100000 loops, best of 3: 10.8 µs per loop\n",
      "100000 loops, best of 3: 12.5 µs per loop\n",
      "10000 loops, best of 3: 34 µs per loop\n",
      "100000 loops, best of 3: 11 µs per loop\n",
      "100000 loops, best of 3: 12.8 µs per loop\n",
      "10000 loops, best of 3: 34.9 µs per loop\n",
      "100000 loops, best of 3: 10.9 µs per loop\n",
      "The slowest run took 4.11 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 12.5 µs per loop\n",
      "10000 loops, best of 3: 34.1 µs per loop\n",
      "100000 loops, best of 3: 10.9 µs per loop\n",
      "The slowest run took 4.05 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 12.5 µs per loop\n",
      "10000 loops, best of 3: 33.9 µs per loop\n",
      "100000 loops, best of 3: 10.8 µs per loop\n",
      "100000 loops, best of 3: 12.3 µs per loop\n",
      "10000 loops, best of 3: 29.1 µs per loop\n",
      "100000 loops, best of 3: 11.1 µs per loop\n",
      "The slowest run took 4.12 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 12.7 µs per loop\n",
      "10000 loops, best of 3: 29.3 µs per loop\n",
      "The slowest run took 4.30 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 10.6 µs per loop\n",
      "The slowest run took 4.01 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 12.8 µs per loop\n",
      "10000 loops, best of 3: 24.7 µs per loop\n"
     ]
    }
   ],
   "source": [
    "res_fortran = []\n",
    "res_numba = []\n",
    "res_python = []\n",
    "for tof_ in tof_range:\n",
    "    timeit_res_fortran = %timeit -o propagation.kepler(k_, r0_, v0_, tof_)\n",
    "    timeit_res_numba = %timeit -o kepler_numba(k_, r0_, v0_, tof_)\n",
    "    timeit_res_python = %timeit -o kepler_python_final(k_, r0_, v0_, tof_)\n",
    "    res_fortran.append(timeit_res_fortran.best)\n",
    "    res_numba.append(timeit_res_numba.best)\n",
    "    res_python.append(timeit_res_python.best)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fde6740f550>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(6, 5))\n",
    "plt.plot(tof_range, res_numba, label=\"Numba\")\n",
    "plt.plot(tof_range, res_fortran, label=\"Fortran\")\n",
    "plt.plot(tof_range, res_python, label=\"Python\")\n",
    "plt.legend(loc=4)\n",
    "plt.ylim(0)\n",
    "plt.xlabel(\"Time of flight\")\n",
    "plt.xticks(rotation=45)\n",
    "plt.ylabel(\"Computation time\")\n",
    "plt.title(\"Elliptic orbit ($e = {:.3f}$)\".format(ss.ecc))\n",
    "plt.tight_layout()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Moderate eccentricity elliptic orbit"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[  2400.           7038.06111541  11676.12223083  16314.18334624\n",
      "  20952.24446165  25590.30557707  30228.36669248  34866.42780789]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7fde672c2e10>,\n",
       " <matplotlib.lines.Line2D at 0x7fde672c9b38>]"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fde6733beb8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ss = State.from_vectors(Earth, r0, v0 * 1.1)\n",
    "tof_range = np.linspace(tof.to(u.s).value,\n",
    "                        (ss.period * 4).to(u.s).value,\n",
    "                        num=8)\n",
    "print(tof_range)\n",
    "plot(ss)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "100000 loops, best of 3: 10.8 µs per loop\n",
      "100000 loops, best of 3: 12.7 µs per loop\n",
      "10000 loops, best of 3: 40.8 µs per loop\n",
      "100000 loops, best of 3: 10.7 µs per loop\n",
      "The slowest run took 4.14 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 12.6 µs per loop\n",
      "10000 loops, best of 3: 41 µs per loop\n",
      "100000 loops, best of 3: 10.9 µs per loop\n",
      "The slowest run took 4.67 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 12.7 µs per loop\n",
      "10000 loops, best of 3: 39.2 µs per loop\n",
      "100000 loops, best of 3: 11.2 µs per loop\n",
      "The slowest run took 7.44 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 12.7 µs per loop\n",
      "10000 loops, best of 3: 41.1 µs per loop\n",
      "100000 loops, best of 3: 11.2 µs per loop\n",
      "The slowest run took 4.08 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 12.5 µs per loop\n",
      "10000 loops, best of 3: 39.3 µs per loop\n",
      "100000 loops, best of 3: 10.7 µs per loop\n",
      "The slowest run took 4.16 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 12.6 µs per loop\n",
      "10000 loops, best of 3: 39.6 µs per loop\n",
      "100000 loops, best of 3: 10.8 µs per loop\n",
      "100000 loops, best of 3: 12.4 µs per loop\n",
      "10000 loops, best of 3: 34.6 µs per loop\n",
      "100000 loops, best of 3: 10.8 µs per loop\n",
      "The slowest run took 4.05 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 12.7 µs per loop\n",
      "10000 loops, best of 3: 24.6 µs per loop\n"
     ]
    }
   ],
   "source": [
    "res_fortran = []\n",
    "res_numba = []\n",
    "res_python = []\n",
    "r0_ = ss.r.to(u.km).value\n",
    "v0_ = ss.v.to(u.km / u.s).value\n",
    "for tof_ in tof_range:\n",
    "    timeit_res_fortran = %timeit -o propagation.kepler(k_, r0_, v0_, tof_)\n",
    "    timeit_res_numba = %timeit -o kepler_numba(k_, r0_, v0_, tof_)\n",
    "    timeit_res_python = %timeit -o kepler_python_final(k_, r0_, v0_, tof_)\n",
    "    res_fortran.append(timeit_res_fortran.best)\n",
    "    res_numba.append(timeit_res_numba.best)\n",
    "    res_python.append(timeit_res_python.best)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fde672f1198>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(6, 5))\n",
    "plt.plot(tof_range, res_numba, label=\"Numba\")\n",
    "plt.plot(tof_range, res_fortran, label=\"Fortran\")\n",
    "plt.plot(tof_range, res_python, label=\"Python\")\n",
    "plt.legend(loc=4)\n",
    "plt.ylim(0)\n",
    "plt.xlabel(\"Time of flight\")\n",
    "plt.xticks(rotation=45)\n",
    "plt.ylabel(\"Computation time\")\n",
    "plt.title(\"Moderate eccentricity elliptic orbit ($e = {:.3f}$)\".format(ss.ecc))\n",
    "plt.tight_layout()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Near-parabolic orbit"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[   2400.           77662.41861854  152924.83723708  228187.25585562\n",
      "  303449.67447416  378712.0930927   453974.51171124  529236.93032979]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x7fde670849b0>,\n",
       " <matplotlib.lines.Line2D at 0x7fde670756d8>]"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n/wP5tprTGUKFYwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fde66faf400>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ss = State.from_vectors(Earth, r0, v0 * 1.38)\n",
    "tof_range = np.linspace(tof.to(u.s).value,\n",
    "                        (ss.period * 2).to(u.s).value,\n",
    "                        num=8)\n",
    "print(tof_range)\n",
    "plot(ss)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The slowest run took 4.29 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 11.3 µs per loop\n",
      "100000 loops, best of 3: 18.7 µs per loop\n",
      "10000 loops, best of 3: 55.6 µs per loop\n",
      "100000 loops, best of 3: 11 µs per loop\n",
      "The slowest run took 6.14 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 13 µs per loop\n",
      "10000 loops, best of 3: 44.6 µs per loop\n",
      "100000 loops, best of 3: 11 µs per loop\n",
      "The slowest run took 4.01 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 12.5 µs per loop\n",
      "10000 loops, best of 3: 39.6 µs per loop\n",
      "100000 loops, best of 3: 11.3 µs per loop\n",
      "The slowest run took 4.20 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 13 µs per loop\n",
      "10000 loops, best of 3: 48.9 µs per loop\n",
      "100000 loops, best of 3: 11.3 µs per loop\n",
      "The slowest run took 4.55 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 13 µs per loop\n",
      "10000 loops, best of 3: 49.9 µs per loop\n",
      "100000 loops, best of 3: 11.2 µs per loop\n",
      "The slowest run took 5.00 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 12.5 µs per loop\n",
      "10000 loops, best of 3: 38.6 µs per loop\n",
      "100000 loops, best of 3: 11.2 µs per loop\n",
      "The slowest run took 4.53 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 12.7 µs per loop\n",
      "10000 loops, best of 3: 44.1 µs per loop\n",
      "100000 loops, best of 3: 10.9 µs per loop\n",
      "The slowest run took 4.47 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 12.6 µs per loop\n",
      "10000 loops, best of 3: 25.8 µs per loop\n"
     ]
    }
   ],
   "source": [
    "res_fortran = []\n",
    "res_numba = []\n",
    "res_python = []\n",
    "r0_ = ss.r.to(u.km).value\n",
    "v0_ = ss.v.to(u.km / u.s).value\n",
    "for tof_ in tof_range:\n",
    "    timeit_res_fortran = %timeit -o propagation.kepler(k_, r0_, v0_, tof_)\n",
    "    timeit_res_numba = %timeit -o kepler_numba(k_, r0_, v0_, tof_)\n",
    "    timeit_res_python = %timeit -o kepler_python_final(k_, r0_, v0_, tof_)\n",
    "    res_fortran.append(timeit_res_fortran.best)\n",
    "    res_numba.append(timeit_res_numba.best)\n",
    "    res_python.append(timeit_res_python.best)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAakAAAFjCAYAAACHX/SJAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XecXFX9//HXmyR0MCAKBEJRioQioIYoiKGIMVRBQESE\ngIo/BCtCEDSAdMUvTQUBpROCCoYOgrEgEOklBAgYSoAgvUMC798f5yyZLFtmJzNz78x+no/HPHbu\nnVs+Z3d2PnPOPfcc2SaEEEIoo/mKDiCEEELoTiSpEEIIpRVJKoQQQmlFkgohhFBakaRCCCGUViSp\nEEIIpRVJKoQQQmlFkgohhFBakaRCqJGk6ZI2m9f9JN0raeP6Rtf7eTu91ucYJB0t6Xv1ia4Ykm6R\nNKzoOEL3BhYdQGgfkqYDCwEr2349r/sGsKvtTYqMrUGcH/O0n+216hZRH8471wudYsh/yz1t39DV\n9pI+BOwGfLTOMSJpO2AY8C4ww/a5XWyzJzAEmAU8YPvSvP6rwLLAcOAS2+N7OeYvgcOBL9e7HKE+\nIkmFepsP+B5wdKNOIGmg7dmtevxmq7E8BtTD63sAV9h+q+bAuiDpA8BPbX8iL98k6Srbz1ZsszYw\nxvZn8/J1kq4Glgc+aPt4SUsBD0m6GXihh2NeBpwqaWnbM+tZllAf0dwX6smkb6b75w+buUgaIulP\nkp6R9Iik/Tq9PlbSNEkvS7ovf/vteG26pAMk3Q28Iul97928zdi87/OSfi9pgRqPP6Cn7SsM7+p8\nktaQNEnSC7kpbevufmmVzXCShkr6c/4dPSvp5B726/YcXZWnl3inS9o0Pz8XWAG4TNIrkvbv4vSj\ngL93F9s82BiYUrF8F9C5Fj4K+G/F8jPAhsCawAEAOQFNAz7V0zFtvwncBnyhbiUIdRVJKtTbrcAk\nYK4PNkkifWu9g9RMsxnwfUlbVGw2DdjI9uLAYcB5kpaueP0rwBeBwbbf7eb8XwW2IDVDrQYcUuPx\n3+lm+2Uqi9XV+SQNzGW9GvgQsB9wvqRVu4nZgHMiuZz0AbwisBwwvqsdJA2q4hydy9NlvBUxpCf2\nbsBjwFa2F7P9yy5CWBt4oJvydBXvR/I1rO4e2+ZNlwderNj1RaDz7+0VYFDF8oLAGsCVubwd77dl\ngYeqOOb9wMerLUtorkhSod4M/AzYLze5dPgUsJTtI2zPtv1f4AzSB2na0f6j7afz8wmkD5jhFcc9\nyfaMHpqYDJySt3kBOBLYpdbj97J9T+cbASxi+5hc1r+Rks9Xe/ndDSd9sP7Y9hu237J9Yzfb9naO\nrn5fPf5++mgwKVm8R9Kako6VtKWkn1W+ZvsR2wf18PhLxXHfrNj1bWDRTuf+M/BRJYsBqwOL2p5l\n+968zZbArbbvBJbo5Ziv5POGEookFerO9n2kD8yxzPmGviIwJDdNvSDpBeAg4MMd+0n6uqQ7Kl5f\nC6hMdI9XbLtrbop6RdIVXW1Dqg0MqeX4PWz/wU7F7ep8QzofC3i0MpZuDAUe7aGWWKmac3R+vfO6\nuX4/ffQCsFjHgqQPA1cAv7R9Bal2U4tXmPta2ELA85Ub2H4GGAN8ExgJ3ENq8uuIZTDpmtnX8qqX\neznm4rk8oYSi40RolHHA7cDxeflx4L+2V+tqY0krAr8DNgVusm1JdzD3h0tlk9T5wPldHGqFTs+f\nrOX4VW7f3fmeBIZKkudM2LYiMLWrsld4DFhB0oDcPNeTas7RVU++zvHO6Ob4vfVavJtUg7ktL+9I\nSpLrKfX8m+tamqSPkJJKd27OtamHgU9WrF+K9D7qbEr+MkSutf00Pxfpy9E3bL+a/469HXMN4Jwe\nYgsFippUaAjbDwMXkXr6GZhMuoB/gKSFcseEtSR1fHgskrd7FphP0hhSzaUvBOwjaTlJSwIHM+ea\nTl+PX832Ar7TxfluAV4HDpA0SNJIYCu6ub5UYTLwFHCMpIUlLSjpM91se3MN5+gq3ou62XYmPXcv\nvxL4XMXyG8BVtq/NXyA6rpsBfWru+wfwiYrjrg9cn4/X0cS3EnBnXrcGqfY5LW+/H3AxsKCk4cBK\npA4e3R1zwbx8XQ9lDQWKJBUa6XBgYYDchLUVsC7wCPA/Uk1l8fz6FFKt6ybgaVJC+Fcfz2fgAuBa\n0rfnh4Ajajl+ldubVJub63y2ZwFbky7i/w84BdjN9oM9Bp9+R1sDq5BqVY8DO3WzbS3n6DLebrY9\nmtQJ5AVJP+zi9XOA0flDHuBCYFFJW+VOEMNzjH1i+zXgOEmH5BrScbl5D1LyWZdU+7tU0j7At8g1\nNEkbAf8H/IdU07wJmJbv2evumFsDf+u49hjKR42cPl7SKOAEYABwhu1ju9jmJNI/2uvAHrbv6Gnf\n/A3wIlLTxnRgJ9sv5tcOAvYE3gG+a/vavH5+0j/x50g38x1s+88NKnYoiKT/Anu5mxtQQ31JOhJ4\nxvaJRcdSK6X7qPbMX0pCCTWsJpW7055CuqdhGLBLrppXbjMaWMX2qqRvRL+tYt+xwHX52sb1eRml\noU12ztuPAn6T26chNWs8bXt122vQmPs7QuhXbB/cygkKwPaISFDl1sjmvuGkqvb0XO0fD2zbaZtt\ngLMBbN8CDM73ofS073v75J8dN1huC1yYu6FOJ93j0tFdeAwVIyDYfq5upQwhhNAwjUxSyzF3d9cn\n8rpqtuncvbZy38rhS2YCHTdjDsnbzbVP7o4KcISk2yRNyN1lQ5uxvXI09YXQXhqZpKq92NXT+GCV\n27zveLnrbW/nGUi64/xGp7G7biIN3RNCCKHkGnmf1AzSzYkdhjJ3TaerbZbP2wzqYn3H/RwzJS1j\n+2lJyzLnJr6ujjUDeA54vaKjxB+BvToHK6lxPUhCCKHN2a6mwlHTgRvyICXAh0n3KcxPuq9hjU7b\njAauzM9HkG7o63Ff4DjgwPx8LHBMfj4sbzc/sHLev6P34oXAJvn5HsBFXcTrRv0uyvAADi06hihf\nlC/K156PRn5+NqwmZXu2pH2Ba0jdyM+0fb+kvfPrp9m+UtJoSdOA10gdHLrdNx/6GGCCpL3IXdDz\nPlMkTSCNdjwb2Mf5twccCJwr6QRSzWtMo8odQgihfho6LJLtq4CrOq07rdPyvtXum9c/D2zezT5H\nAUd1sf4x5r47PoQQQguIESf6j0lFB9Bgk4oOoMEmFR1Ag00qOoAGm1R0AK2qoSNOtJI8TmdjLvyF\nEEIba+TnZ4yCHkJoS9FjtzGa/WU+klQIoW1F60h9FZH445pUCCGE0ookFUIIobQiSYUQQiitSFIh\nhNDGJJ0l6edFx1GrSFIhhNBkkqZLmilp4Yp135D0twacrpqBuEsrklQIIRRjPuB7TTpXy/ZyjCQV\nQgjNZ9KUQftL+kDlC5JWlPSupPkq1k3K45UiaQ9JN0r6laQXJE2T9BlJYyQ9lmtoX+90vqUkXSvp\n5XysFSqOfWLe7yVJt0raqIHl7rNIUiGEUIxbScMl7V/Ftp2b7IYDdwFLkmZ5mACsD3wU+BpwSkVT\nooBdgcOBpUizRZxfcazJwMeBJYALgIslzV9TiRogklQIod+ScD0eNZ7ewM+A/SQt1cd9/2v77DzT\nwwTSzOSH255l+zrgbWCViu0vt/0v228DBwOflrQcgO3zbb9g+13bvwIWAFavsUx1F0kqhNBv2age\nj9rP7/uAy0lz4/Ul2c2seP5GPtb/Oq1btOM0VEw4a/s14HlSYkPS/pKmSHpR0gvAB0g1rlKIJFVJ\nWgSpZS8whhBa0jjgm8Byefm1/HPhim2WmYfji4pZyyUtSmomfFLSZ4EfAzvaHmx7CeAlStTRIpLU\n3M4Cvl90ECGE/sP2w8BFpJ5+tv0sMAPYTdIASXuSrjXNi9GSNszXmn4O3GR7BrAYaZLYZyXNL+ln\nwOLzeK66iiQ1tx8B+yNtVXQgIYR+5XDmrjl9k1TDeRYYBtxY8VpX9z311FRoUkeJccBzwHqkzhUA\nV+fHg6SZzt8AHqulAI0S80ll782HIo0AJgKbY99ddFwhhNrEHHH1193vtJG/66hJdWbfDHwXmIi0\ndNHhhBBCfxZJqiv2eNL1qUuRFiw4mhBC6LeiuS97X3U19fK7gNSeuyvxiwqhpURzX/1Fc1+ZpKS0\nJ/AR4JCCowkhhH4ppo/vif0G0nbALUgPYE8oOqQQQuhPIkn1xn4aaRvgOqTp2JOLDimEEPqLaO6r\nhn0XsBfwZ6ShvW0eQgihPqImVS37MqTVgcuQNsJ+teiQQgih3UXvvqyq3impx9/ppMEXt8d+txmx\nhRD6Lnr31V/07iu7lNH3AQYDRxccTQihReXp41+X9Ep+vCypT4PIShop6fFGxVgWkaT6Ks3HsgOw\nPdKYosMJIbQkA1vZXiw/Frf9dLU7S6rqUo2kATVHWBKRpGphPwdsDRyD9LmiwwkhtD5JC0g6QdKM\n/Pi/jhlyc63pCUkHSHqKNNDAlcCQiprYspIOlfRHSedKegnYXdKnJN2Up5p/UtLJkgZVnPddSXtL\nejBvc0oxv4GuRZKqlT2VNCXzRUir9LZ5CCF00vkazsGkaeE/nh/DmXsggaVJU7yvAHwd+CLwZEVN\n7Km83TbAxbY/QEpm75CmAfkg8GlgM9Jli0pbAp8E1gF2kvSFupSwDqJ337yw/4p0KKnH36exXyw6\npBBC9XSY6tJzzOP63GlAwKWSZuflScDawL55PikkHQacRppiHuBdYJztWcAsdT9B679tTwSw/SZw\ne8Vrj0r6HfA54MSK9cfYfhl4WdLfgHWBa/pYpoaIJDWv7FORPgZMQNqS9AYKIbSAGpJL3U4NbGv7\nho4Vkl4HHq3Y5jHyFO/Z/5yuiffmicoFSasBvwI+QZqzaiBwa6d9Kq+Hvc6cqecLF8199fEj0uyW\nJ8b08yGEGj0JrFSxvEJe16GaiQ67mhDxt8AUYJXcBHgwLfTZ3zKBlpr9DvAVYGNg34KjCSG0pguB\nQyQtJWkpUjPfuT1sPxP4oKTK6d67+pK8KPAK8LpSq8//6yWOUn3RjiRVL6k9d2vgIKRRRYcTQmg5\nR5Ca4e7Oj1vzug5z1ZCcOm9dCDwi6XlJy9J1TWp/4KvAy8DvgPGdtumqhlaaUR5ixImsbndMSxsC\nlwCbYN83z8cLIdQkRpyov7YbcULSKElTJT0k6cButjkpv36XpPV621fSkpKuy336r5U0uOK1g/L2\nUyVtUbF+Ul53R34s1agyY98I/JDU4+9DDTtPCCH0Aw1LUvlO51OAUcAwYBdJa3TaZjTpYt6qwLdI\nF/h623cscJ3t1YDr8zKShgE75+1HAb+p6KJp4Ku218uPZxtU7Hw2n0e6P+ESpAUaeq4QQmhjjaxJ\nDQem2Z6e+/WPB7bttM02wNkAtm8BBufxq3ra97198s/t8vNtgQttz7I9HZgGbFBxrmZX+38GPAWc\nHj3+QgihNo1MUssBlYMfPpHXVbPNkB72Xdr2zPx8JukubPI+T3Tap/Ieg7NzU19zpoJPI6TvTqrZ\njW3KOUN7k+ZDis5OoV9p5M281fbIqKaWoa6OZ9tSVXeM72r7SUmLAn+StJvt93XtVBo9osMk25Oq\nOHb37NfzrL4d08//eZ6OF9pXGjB0WdKXseXzo/Pz5YCpSJ/NvUlDKISkkcDIZpyrkUlqBlA5i+1Q\nOt0J3cU2y+dtBnWxfkZ+PlPSMrafzl0un+nhWDMAbD+Zf74q6QJSc+L7kpTtQ6stXNXsJ5G2Ba5B\nehT7trqfI5SbtCDdJ5+O5Q8B/yO9Z5/IjxnAnRXPZ5BGDjgfabt8f14ITZe/wE/qWJY0rlHnamSS\nuhVYVdJKpLumdwZ26bTNRNLNr+MljQBetD1T0nM97DuR1Ix2bP55acX6CyT9ivRPvyowOXfCWML2\ns3nk362Ba+te2p7YtyN9C7gUaQT2jF73CeWXrjUuTs+1n+WBxUjv48rk8wjwD+YkpaerGlJL+i5w\nHXAk0Ywc+oGGJSnbsyXtSxqkcABwpu37Je2dXz/N9pWSRkuaBrwGjOlp33zoY4AJkvYCpgM75X2m\nSJpAGv5jNrBPbg5cELg6J6gBpH/w0xtV7m7Zl+Tp5ycibYz9WtNjCNVL136WovcEJOYkn8raz+XM\nSUDP1m0WZ3sW0peByUj3YJ9fl+OGUFJxM2/WlBv/0jfvs0jDlOwY08+XhLQmsAfvv/7zCu9vfuv8\n/GWK+CeS1gL+BmyJPbnp528B/eFmXknTgb1sX9+k8zX9Zt5IUlnT3tDpvqm/Av/APrjh5ws9kz5O\nqrGfAdxP5fUf+40iQ+tVutb5a2CDaEJ+vzInqZxcPkya6+k14CrSNB3dtrBIOgt43PZPK9b9l5Sk\nbuhuv3oqIknFVB3NZr+F9CXm9Pg7p+iQ+q05CWo/7IuLDqfP7L/kWuAlSJ8rfVINlTqmj79B0hDS\n+/AQ4KBiwyqfuOeiCGnEi62BXyJtVHQ4/VKrJ6g5jgYeBs6Im8ZbU+59fDWwn6S55nmS9ENJl0r6\nJmmQ2APydPF/qdhsvTys3IuSxqtilBtJ38xDxT0n6S+5R3THa6WeNr5DJKmi2FOA3YCLkT5SdDj9\nSvskKPL1sL2A1YEDCo4m9I0AJA0lTQV/IrBynk6jw27A2bZPB84Hjs3TxW9bcYwdgS8AK5Omf98j\nH3dT4Kj8+rKkCRXHd4qhtNPGd4gkVST7GlJX4suQPlB0OP1COyWoDvbrpOHBvou0ddHhtBTJdXnU\ncGbS9PEvAP8k3XP0c2AC8LUUmtYEViT1FK3cr5KBk2w/bfsF4DLS1O8Au5J6Rt+ZZ/Q9CPi0pBUq\n9j/G9su2Hyd1xFmXkokkVTT7FNIbdHwedSA0SjsmqA72E8AOwJn5OlWohq26PGo4M2n6+CVsr2R7\nX9tvksYj/WreZjfgIvd+/1zl1O9vAIvk5x21p1xUvwY8x9zD05V22vgOkaTK4Xukv8XxRQfStto5\nQXWwbwZ+RLoX74NFhxP6zulv+LakjUkDGFSOjNPXGttc09FLWgT4IHNG72kJkaTKwJ5NGlVjC6Te\npnYOfdUfElSHNCbln0jXOgcVHU6oybmkqYretv3vivUzgWquX3fU7C4Exkj6eO5McRRws+3Hetmv\nVCJJlYX9IrAVMA7p80WH0zb6U4Ka4yBSs88JRQcSanIusCZwXqf1ZwLDck+87garfm/q93yD709J\nX1qeJHWs+Eqnbbvct0ziZt6sNDf+pWr+xcDnsKcWHU5L658JKkkdcW4CTsI+tehwilCa/+k+krQQ\nqda0nu2Hi46nUttNHx9qYP8DOBC4PK4rzIP+nKAA7JdIE4QeRppWIbSO/wdMLluCKkrUpLLSfeuS\njgVGAJ8ndR8N1ervCaqStDmp2egz2I8UHU4zle5/ugp5uCQD29m+q+Bw3ifG7itQ6d7QaRTuPwHP\nA98oZBDTVhQJ6v2k/YBvkRLVK0WH0yyl+59uA9HcF+ZII6TvBqwP7F9wNK0hElR3TiFdnzo3pp8P\nrSbesGVmv0oa4+97eRr60J1IUN1LtfB9gSWBwwuOJoQ+iSRVdmkkgS+RBhAt3ZAlpRAJqnfpuuYO\nwK5IX+lt8xDKIq5JZaVvv5Z2JI1IsQH2U0WHUxqRoPpGWge4Hvgi9q29bd7KVNuYeqEX0XGiIKVP\nUgDSIaTmv5ExdxCRoGqV5jM7CRgeX3hCPUSSaoIWSVIi3Y0+CNilX08/Hwlq3kg/JU3TMJI0sGkI\nNYsk1QQtkaQApAVJzTUvAGOx7y04ouaLBDXv0heei4A3gd3jFocwL6ILepgjfevdjJSobkD6A3PP\nD9PeIkHVR0pKewBrkUZOD6GUIkm1IvtN7P8DViUNu38H0vFtP4xSJKj6SpMlbgv8EGl00eE0lbQw\n0uFId5OmsAglFUmqldkvYR9C+ja8EPAA0sFt+U8XCaox0oysXwbOQlqj6HAaTlLuODIFWI00OnhM\nj1NicU0qa5lrUj2RVgWOADYiTUV9Jr3P6ll+kaAaT9oDOJh0i8PzBUfTGNLqpF6Ny5PeSzcgrQX8\nFVgl3zwfahDXpEJ17IewdyaNfr0DcB/STvkieWuKBNUc9lnAROAipIEFR1Nf0qJIxwA3AlcD62Lf\nAJA7Hv0d+E5xAYaeRE0qa4uaVGdpBOxjSKMqjyVNgtY6IkE1V0pOlwMPYH+v6HDmWfpy1nET/CTg\ngC7vC5OG5ddXwX65iRG2jeiC3gRtmaSgYzT1HUnNgP8lJavbiw2qCpGgiiENBm4Gfol9RtHh1Exa\nEzgZ+CCwL/Y/e9n+fGAK9pFNiK7tRJJqgrZNUh2kQcA3SNNJ/wM4BHtasUF1IxJUsaTVgH8BO/T6\n4V420uLAOODrwGHAqdizq9hvdVKZV8kTRoY+iGtSYd7Zs7B/S+q2fg9wM9KvkZYpOLK5RYIqnv0g\n8DVgAtKKRYdTldRr72vA/cBgYE3sU6pKUAD2A8BVQOs3c7aZqEllbV+T6kxaCvgJsDvwG+AXhbfH\nR4IqF+n7wBhgw1L3fEvvm1OAhYHvYN9c43FWJc27tQr2i/ULsP1FTSrUn/0s9g9JkyoOBR5C+gHS\nAoXEEwmqjE4EbgXOKeVkidJgpJOBa4HzSAPm1pagIPWOTT0cf1CfAEM9lO+NF5rLfhR7D9JQS5uQ\nbgjeHWlA02KIBFVOqZllH2Bp0nWecpDmQ9oTmEoabHkY9mnY79Th6EcA+yItWYdjhTqI5r6s3zX3\ndUfaCDgWWBw4CLiioYOPRoIqP2lp4Bbgx4X/jaRPkJr2ROq1V/85saTTgWewD677sdtU9O5rgkhS\nFdL9JVsDRwPPAwdi/7sB54kE1SrSrNDXAV8o5BaGNC7lkcB2pC9PZzdsqhppJeA2YHXsZxtyjjYT\n16RCc9nGngisA5wJXIj0l3zvSX1Egmot9p2kMe4uyTWr5pAGIO1NGmtvFrAG9h8aOpeaPR2YAOzf\nsHOEqkVNKouaVA/SHFbfAQ4kjUgwLg9MWuvxIkG1KulQYAtgE+y3GnyuEaSmvTdITXt3NfR8c597\nKHAX8DHsZ5p23hbVsjUpSaMkTZX0kKQDu9nmpPz6XZLW621fSUtKuk7Sg5KuVbpDvuO1g/L2UyVt\n0cW5Jkq6p97lbHtpapDjSaNGPwXcifTLmqYGiQTV6g4njRx+asPGhJQ+jHQm8CfgBGDjpiYo6Bgd\n/gLggKaeN7xPw5KUUu+wU4BRwDBgF3WaCkBpDptVbK8KfAv4bRX7jgWus70aaeK/sXmfYcDOeftR\nwG9U0W1W0vbAK6Rx7EIt7BfzxeS1gUVJPQEPQlq4qv0jQbW+1My2O7Ae8P26HlsaiLQvcB/wIqlp\n77wCZw0+GtizdDe89zONrEkNB6bZnu40XcR40gRrlbYBzgawfQswWOkN0dO+7+2Tf26Xn28LXGh7\nllOb8rR8HCQtSrr34QhSr6AwL+wnsb8NfIb0YfUQ0t556KWuRYJqH/ZrpP+3A5C+UJdjpl6ltwHb\nAyOxf1T4zeX2DOAcUjN3KEgjk9RyQOV1iyfyumq2GdLDvkvbnpmfzyTdw0He54lO+wzJz38O/BJ4\nvc+lCN2zH8TeifRFYSfS1CA7vq8ZKBJU+7EfJQ1cfG4e96420rJI5wIXAkcBm2HfV58g6+JYYHek\nIb1uGRqikfPGVFtFr6Zmo66OZ9uSejqPlLrOfsT2D5S6lva08aEVi5NsT6oitmD/J08L8nnS1CAH\nIB2YJ5WLBNWu7H8hHQRMRBqB/ULV+6Za936koblOJzXtlW/oJfsppD+Qur3vV3Q4ZSFpJDCyGedq\nZJKaQRpup8NQ5q7pdLXN8nmbQV2sn5Gfz5S0jO2nJS0LdPS86e5YI4BPSvovqbwflnSD7U07B2z7\n0OqLF+aSrhtci/RXUq3qd6Tf+dpEgmpf9plIawPjkbascsTxTUjXnJ8gjQv4QIOjnFfHAVOQjsXu\n/BnWL+Uv8JM6liU1bESSqpr7JK2k9E0ZSQsrDYffm1uBVfO+85M6NUzstM1E0pD6KHU3fTE35fW0\n70TShVvyz0sr1n9F0vySViaN9j3Z9qm2l7O9Mmla9Qe7SlChTux3sceTOrBMAPaIBNX29ie1dhzX\n41bS8kjjgT8AhwCjWiBBQfpMOpNU6wtN1muSkvQt4GLgtLxqeeCS3vZz+ka1L6mpZwpwke37Je2t\ndHMetq8EHpE0LR9/n572zYc+Bvi8pAeBTfMytqeQPhSnkIbc38fv7xXUZbNhaAD7bezTsa8uOpTQ\nYOn/dWdgqzym3tyk+Um3kdwJPEgaa++SAnvt1eIXwM4tM3VJG+n1Zl5Jd5F6yd1se7287h7bazch\nvqaJm3lDmEfSx0gTan4J+8a8bgvSDLkPAd/Dfri4AOeRdBTwQey9iw6lbIq+mfctV9xZLmkgURsJ\nIXRmTyU1wV+M9FmkP5PuffwR9lYtnaCS44Evky4nhCapJkn9XdLBwMKSPk9q+russWGFEFqSfRXp\ndo9rgTtIM+ReXmxQdWI/R5og9JCiQ+lPqmnuGwDsRRqvC9J1ojO6uN7T0qK5L4Q6khbJN/22F2kJ\nUtPlCOxpRYdTFjFVRxNEkgohVCV1t145TxYaKPialKStJd0h6QVJr+RHscOVhBBCcU4AtkRarehA\n+oNqmvseBr4E3OtGzuFSsKhJhRCqJh1Cmsbja0WHUgZF9+57ArivnRNUCCH00UnAFnSa2SHUXzU1\nqRGkOWT+BrydV9v2rxocW1NFTSqE0CfSWODj2LsUHUrRGvn5Wc3YfT8nzcO0IDB/I4IIIYQWdArw\nMNJa2PcWHUy7qqYmda/ttZoUT2GiJhVC6DPpx8Bw7B2LDqVIRV+TulL1mtgshBDay2+AjZDWKTqQ\ndlVNTepVYGHS9ahZebVtVzMSesuImlQIoSbSD4DPYm9fdChFiZt5myCSVAihJtJCwDRga+zbiw6n\nCIUkKUlr5Kk11u/qdbfZHyOSVAihZtJ3gc2xtyk6lCIUlaROt/1NSZPoeur2TRoRUFEiSYUQaiYt\nSKpNbYd9a9HhNFuhzX2SFrT9Zm/rWl0kqRDCPJH2AbbE3rLoUJqt6N59/65yXQgh9GdnAmuTBkAI\nddLtzbyG5aN8AAAgAElEQVSSlgWGkOaRWp85U68vTurtF0IIoYP9FtKRwKHAqIKjaRs9XZPaHdgD\n+CRQ2cb6CnCW7T83PLomiua+EMI8k+YHHgR2xb6x6HCapehrUl+2/cdGnLxMIkmFEOpC2gvYBXvz\nokNplrhPqgkiSYUQ6kIaBEwFxmD/o+hwmqHojhMhhBCqZc8iDcx9WNGhtINIUiGEUH/nAcsjtdX9\npEWoqrlP0obASszpDWjb5zQwrqaL5r4QQl1JXwP2Bjamza+rFN1x4jzgI8CdwDsd623v14iAihJJ\nKoRQV9IA4D5gX+y/Fh1OIxWdpO4Hhjm+CYQQQt9IuwD7ARu2c22q6I4T9wLLNuLkIYTQ5iYAHwBi\nTr4aVVOTmgSsC0wG3sqr7TYb7TdqUiGEhpB2BH4MbNCutamim/tG5qcdG4qUpP7eiICKEkkqhNAQ\n0nyka/oHYV9RdDiNUPjNvJKWAT5FSlSTbT/TiGCKFEkqhNAw0vbAwcAn27E2Veg1KUk7AbcAOwI7\nAZOVqq8hhBCqcynp87atLpM0QzXNfXcDm3fUniR9CLje9jpNiK9poiYVQmgoaVvSKBTrY79bdDj1\nVHTvPgH/q1h+Lq8LIYRQvYmke023KzqQVtLtfFIVrgaukXQBKTntDFzV0KhCCKHd2Eb6GXAM0qXt\nVptqlGqa+wRsD2xE6jjxT9uXNCG2pormvhBCw6XP05uB47EnFB1OvRTeu68/iCQVQmgKaRRwPLAO\n9ju9bd4KCrkmJenG/PNVSa90erxczcEljZI0VdJDkg7sZpuT8ut3SVqvt30lLSnpOkkPSrpW0uCK\n1w7K20+VtEXF+qsl3SnpPklnKs33EkIIRbgGeInUWzr0omE1KaXBFR8ANgdmAP8BdrF9f8U2o4F9\nbY+WtAFwou0RPe0r6TjgWdvH5eS1hO2xkoYBF5Du51oO+Cuwqm1LWtT2q/mcfwQutX1ep3ijJhVC\naA5pc+AUYM12qE0VfZ/UudWs68JwYJrt6U6TgI0Htu20zTbA2QC2bwEG5xuHe9r3vX3yz46eMtsC\nF9qeZXs6MA3YIB+7I0ENAuYHnq0i/hBCaJTrgWeAXYoOpOyq6YK+VuWCpIHAJ6rYbzng8YrlJ/K6\narYZ0sO+S9uemZ/PBJbOz4fk7bo8n6Rr8vZv2L66ivhDCKExUhPWOGAc6TM1dKOna1I/kfQKsHbl\n9ShS9p9YxbGrbUespoqoro6Xpw/p6Tyu2PYLpNHcF5C0e5WxhRBCY9h/I32Z/lrRoZRZtxnc9lHA\nUZKOsT22hmPPAIZWLA9l7ppOV9ssn7cZ1MX6Gfn5TEnL2H5a0rKkpNndsWZULGP7LUl/IjUDnk0n\nkg6tWJxke1J3hQshhDoYB5yFdD7p0kZLyAOPj2zKuaocYHYJYFVgwY51tv/Ryz4DSZ0fNgOeJE31\n0VPHiRHACbnjRLf75o4Tz9k+VtJYYHCnjhPDmdNxYhVgYWBx20/l454PXGv7zE7xRseJEELzSdcB\n4+n0mdRKGvn52WtbqKRvAt8l1VLuAEYANwGb9rSf7dmS9iV1txwAnJmTzN759dNsXylptKRpwGvA\nmJ72zYc+BpggaS9gOrkbp+0pkiYAU4DZwD65Z98iwF8kLUBqNrwG+H11v54QQmi4ccAFSOdiv110\nMGVTzYgT95K6dd9ke11JHwOOtv2lZgTYLFGTCiEURroauAT7tKJDqUXRA8y+afuNHMiCtqcCqzci\nmBBC6KfGAQeTWnxChWqS1BP5mtSlwHWSJpKa2UIIIdRDuk/0HmCvokMpmz6NOJF7dCwOXO02azuN\n5r4QQqGkT5IqA6tgv1l0OH1RmhEnbE+yPRFo2V4oIYRQSvatwG3At4oOpUwaOeJECCGEvjkUOBBp\noaIDKYtGjjgRQgihL+w7gFuAbxcdSllU0wW91hEnWkpckwohlIK0Dul+zlWwXys6nGoUOumhpM/R\n9bh5PY440WoiSYUQSiMNTPAf7F8UHUo1ik5SlzMnSS1IGnboNts9jjjRaiJJhRBKQ1oTuAH4KHmq\noTIr1fTxkoaSJifcvhEBFSWSVAihVKQLgbuwjyk6lN6ULUkJmGJ7jUYEVJRIUiGEUklD0P2DdG3q\n5aLD6UnRA8yeXLE4H7AuqS9/CCGERrGnkiZr3Q84suhwilLNNak9mHNNajYw3faNDY6r6aImFUIo\nHWlV4N+k2tRLRYfTncKb+/I0Fx8D3gUeaLchkSCSVAihpKSzgP9iH1Z0KN0punfflsCpwCN51UeA\nvW1f2YiAihJJKoRQStJHgZuBFbFfLzqcrhSdpB4AtrQ9LS9/FLjSdltN1xFJKoRQWtJy2DOKDqM7\nRc8n9XJHgsoeAUrd0ySEENpKiRNUo1VTkzoVWAGYkFftCDwGXAdg+8+NDLBZoiYVQgi1Kbq576z8\ntGNDVTzH9phGBNZskaRCCKE2hffu6w8iSYUQQm2Kvpn3I6SbyVaq2N62t2lEQCGEEEKHXpMUaTrj\nM4DLSPdJQRejoocQQgj1Vk2SetP2SQ2PJIQQQuikmo4TuwEfJU3C9VbHetu3Nza05oprUiGEUJtC\nr0kBawK7AZswp7mPvBxCCCE0TDU1qYeBNdpxvL5KUZMKIYTaFD3ixD3AEo04eQghhNCTapr7lgCm\nSvoPc65JRRf0EEIIDVdNkhqXf3Y54kQIIYTQKNXOJ7UM8ClScpps+5lGB9ZscU0qhBBqU+g1KUk7\nAbeQBpbdCZgsacdGBBNCCCFUqqZ3393A5h21J0kfAq63vU4T4muaqEmFEEJtiu7dJ+B/FcvP5XUh\nhBBCQ1XTceJq4BpJF5CS087AVQ2NKoQQQqD6jhM7ABvmxX/avqShURUgmvtCCKE2hcwnJWlVYGnb\n/+q0fiPgKdsPNyKgokSSCiGE2hR1TeoE4OUu1r+cX6uKpFGSpkp6SNKB3WxzUn79Lknr9bavpCUl\nXSfpQUnXShpc8dpBefupkrbI6xaSdIWk+yXdK+noauMPIYRQnJ6S1NK27+68Mq9buZqDSxoAnAKM\nAoYBu0hao9M2o4FVbK8KfAv4bRX7jgWus70acH1eRtIw0jWzYXm/30jqyO7H2V4DWA/YUNKoasoQ\nQgihOD0lqcE9vLZglccfDkyzPd32LGA8sG2nbbYBzgawfQswON883NO+7+2Tf26Xn28LXGh7lu3p\nwDRgA9tv2P57Pscs4HZguSrLEEIIoSA9JalbJX2r80pJ3wRuq/L4ywGPVyw/wfuTQ3fbDOlh36Vt\nz8zPZwJL5+dD8nbdni83DW5NqoGFEEIosZ66oH8fuETSrsxJSp8AFgC+VOXxqx3jr5oLbl2OGWjb\nkno6z3uvSRoIXAicmGtaIYQQSqzbJGX7aUmfIU1uuBbpw/5y2zf04fgzgKEVy0OZu6bT1TbL520G\ndbF+Rn4+U9IyOcZlgY6xBLs61oyK5d8BD9g+qatgJR1asTjJ9qSuixVCCP2XpJHAyKacq5r7pGo+\neKq5PABsBjwJTAZ2sX1/xTajgX1tj5Y0AjjB9oie9pV0HPCc7WMljQUG2x6bO05cQLqetRzwV1Kn\nDEs6AvgYsKO7KHR0QQ8hhNoUPX18zWzPlrQvcA0wADgzJ5m98+un2b5S0mhJ04DXgDE97ZsPfQww\nQdJewHTSwLfYniJpAjAFmA3skxPU8sBPgPuB23OHv5Nt/76R5Q8hhDBvGlqTaiVRkwohhNoUPcBs\nvyHF7yOEEMokPpTndoHELyQWKTqQEEIIkaQ6+y7pnqv7JLYuOpgQQujv4ppUVtmmKrEZaXime4Dv\n2e/rNh9CCCGLa1JNZnM9sA5wL3CnxHclBhQcVggh9DtRk8q6+yYg8THgVGBRYG+76iGhQgihX4ia\nVIFsppJG3TgZuELiBInFCg4rhBD6hUhSVbCxzdnAmsBiwBSJ7aWqxhwMIYRQo2juy/pSXZXYGDgN\neAjYz+bRhgYXQgglFs19JWPzD2Bd0niCt0n8SGrsEFMhhNAfRU0qq/WbgMQqpO7qHyJ1rLil7sGF\nEEKJRU2qxGymAVsAxwGXSvxa4gMFhxVCCG0hklQd5I4VFwDDSCPLT5HYOTpWhBDCvInmvqye1VWJ\nz5A6VjwBfMfmkXocN4QQyiia+1qMzb+B9YFJwGSJsRKDio0qhBBaTySpBrGZZXMs8ClgY+AOiQ0L\nDiuEEFpKNPdljayu5mtTXwZOAK4Axto834hzhRBCs0VzX4vLHSsuJnWseJs0Fciu0bEihBB6FjWp\nrJnTx0sMJ3WseBbYx+ahZpw3hBAaIWpSbcZmMula1VXATRI/lVig4LBCCKF0IkkVxGa2za9IvQA/\nCdwl8bmCwwohhFKJ5r6smc19XZ+f7UjTgfwV+LHNs0XFEkIIfRHNff2AzaWkjhUvkjpW7BEdK0II\n/V3UpLKia1KVJNYHfge8Cnw7T7wYQgilFDWpfsbmdmAD4E/AvyQOl1iw4LBCCKHpIkmVlM07NicD\nHyc1A94jsXnBYYUQQlNFc19Wpua+rkhsBZwC/Av4oc0zBYcUQghAg0fsiSSVlD1JAUgsAowD9gBu\nIF2z6uvjdZt3mx17I+UOJgsCi+XHohXPq11ulfvU3gFeyY+Xu3ne7bLNrAJiDm0uklQTtEKS6iDx\nMdL09YvW8FgYeJ3aElx3j9f68uGXk8pC1JZQuttmNnM+kF9l7g/oapbfAlrhn2EQqbyLM/fvoNrl\njt9TVUmtl+U37cb+ziQG5DIPAubv4/NqthsIvFvxeKeK50VtN73Rv+9aRZJqglZKUvNCYj5Soqol\nwfX0mE3XCUy8P6EsCsyi9oTyvuWoIfSuU42z1iRXuTyQ7pPYG/n1viaNzs9Feq+8nX9W+7za7Wbn\nc8wHDMg/e3pe1HYDgJUjSfVj/SVJNUL+8FuA9yeuxUi1k85J5dVIKq0vz5HWXRJbiO4TRtVJx+ad\n5pUo1CqSVBNEkgohhNrEfVIhhBD6pUhSIYQQSmtg0QGUiQ7TIqRrKG8D73hctIW2Ix2mAaQOBAtU\n/BxE+tKmkv806WL/rIqf1Tzv8XWPc1vdlhDaR1yTyiSZQ/kjsCWpd9F8pG7Jb1c85nW5HsfoWO64\noGzmdJ3u8nkZkq0Ok0hfijqSQmWCaPTPzutE+j2+WfFzNnO6+rrEPzt+jwOZ0wOut+fVbGvqlPDy\nz9nMnVzL9rzjJ6SeiK+Rbs3o/JiX9W+X4X+vGaLjRBN0/iXnb9vzVzwWKHi5ct0CzPlH64i5u+eV\nekxmVTyvZZ+BzEkO7zJ3Yqjnz75sO7u/fHhUK7/f65HwOn4OYE5yfbfEzzvu2Vu402ORKtf1tH4g\ntSe7rl67sazv25ZOUpJGASeQ3rRn2D62i21OAr5I+kPsYfuOnvaVtCRwEbAiMB3YyfaL+bWDgD1J\nNY3v2r42rz8S2A1YwvZiXcTQtr37ci2mt2TW2/Na938vMXmcZ9ehOCG0BB2mgfQtqXW3vuPx2UhS\n9T64NAB4ANgcmAH8B9jF9v0V24wG9rU9WtIGwIm2R/S0r6TjgGdtHyfpQFLiGStpGHABaWr25UgT\nCK5q25KGA48BD/W3JBVCCI3Uyl3QhwPTbE+3PQsYD2zbaZttgLMBbN8CDJa0TC/7vrdP/rldfr4t\ncKHtWbanA9NIU15ge7LtpxtQxhBCCA3S6CS1HPB4xfITeV012wzpYd+lbc/Mz2cCS+fnQ/J2PZ0v\nhBBCi2h0F/Rq2xKrqSaqq+PlpryezlN1e6akQysWJ9meVO2+IYTQX0gaCYxsxrkanaRmAEMrlocy\nd02nq22Wz9sM6mL9jPx8pqRlbD8taVl4b26lro41gyrZPrTabUMIob/KX+AndSxLGteoczW6ue9W\nYFVJK0maH9gZmNhpm4nA1wEkjQBezE15Pe07Edg9P98duLRi/VckzS9pZWBVYHJjihZCCKHRGlqT\nsj1b0r7ANaRu5Gfm3nl759dPs32lpNGSppHuCxjT07750McAEyTtRe6CnveZImkCMIV0M+E+zt0X\nc4/AXYCFJD0OnG778EaWP4QQwryJm3mz6IIeQgi1aeUu6CGEEELNIkmFEEIorUhSIYQQSiuSVAgh\nhNKKJBVCCKG0IkmFEEIorUhSIYQQSiuSVAghhNKKJBVCCKG0IkmFEEIorUhSIYQQSiuSVAghhNKK\nJBVCCKG0IkmFEEIorUhSIYQQSiuSVAghhNKKJBVCCKG0IkmFEEIorUhSIYQQSiuSVAghhNKKJBVC\nCKG0IkmFEEIorUhSIYQQSiuSVAghhNKKJBVCCKG0IkmFEEIorUhSIYQQSiuSVAghhNKKJBVCCKG0\nIkmFEEIorUhSIYQQSiuSVAghhNKKJBVCCKG0IkmFEEIorUhSIYQQSiuSVAghhNJqaJKSNErSVEkP\nSTqwm21Oyq/fJWm93vaVtKSk6yQ9KOlaSYMrXjsobz9V0hYV6z8h6Z782omNKm8IIYT6aliSkjQA\nOAUYBQwDdpG0RqdtRgOr2F4V+Bbw2yr2HQtcZ3s14Pq8jKRhwM55+1HAbyQp7/NbYK98nlUljWpM\nqctL0siiY2ikKF9ri/KF7jSyJjUcmGZ7uu1ZwHhg207bbAOcDWD7FmCwpGV62fe9ffLP7fLzbYEL\nbc+yPR2YBmwgaVlgMduT83bnVOzTn4wsOoAGG1l0AA02sugAGmxk0QE02MiiA2hVjUxSywGPVyw/\nkddVs82QHvZd2vbM/HwmsHR+PiRv19WxKtfP6CKOEEIIJdTIJOUqt1Pvm6CujmfbfThPCCGEFjOw\ngceeAQytWB7K3DWarrZZPm8zqIv1M/LzmZKWsf10bsp7ppdjzcjPuzrWXCS1dcKTNK7oGBopytfa\nonyhK41MUreSOimsBDxJ6tSwS6dtJgL7AuMljQBetD1T0nM97DsR2B04Nv+8tGL9BZJ+RWrOWxWY\nbNuSXpa0ATAZ2A04qXOwtqup0YUQQmiihiUp27Ml7QtcAwwAzrR9v6S98+un2b5S0mhJ04DXgDE9\n7ZsPfQwwQdJewHRgp7zPFEkTgCnAbGCf3BwIsA9wFrAQcKXtqxtV7hBCCPWjOZ/jIYQQQrn06xEn\nJK0u6dOSBuV7s/o9Sf36PRHKreLex9BP9NualKQdgKNInSueJF1DO8v2S4UGVgBJ65Ou491t+9Gi\n46m3fO/dINuP97pxC4rytbYoX8/65bdmSfOTOmPsZXsz4C+kXn8HSPpAocE1maQtgauBrYA/Sfqe\npLUKDqtuJO0IXAH8WdJxkjYpOqZ6ivK1tihf7/plksoWJ/UABLgEuByYH/hqf2nykjQQ2BTY0/be\npCGmlgV2lLRmocHVgaQlSb1H9wK+ALwJbCVpp0IDq5MoX2uL8lWnX3wYd2b7beB4YHtJn7X9DnAj\ncCewUaHBNZHt2aTEvENe/ivwJ2AB8jAuLZ6w5wMWJt33/TzwK+AR0nBZGxYaWX30+/K1+DWqfv/3\nq/Yg/dU/SV3cvy5pY9uzbZ9PGkZpnWJDayxJC1ckn+OAtyR9BcD2f4BJwLclLWf73YLCnGe2nwUu\nBnaTtILtF4ELSLcobFNocHUQ5Xtv1JmWFH+/6vTbjhMAkpYAvgpsDfwZeBv4MbBpxfiAbUXSNsAP\ngHuAJ20fI+mbpNHjJ9u+MG93HnCG7UmFBVsDSV8APg68ThpMeAlgP9I4jxNsPyrpQ6S/95db7e8c\n5YvylVkjytefa1LYfgE4nTR6xaakJq7dWu2NUS1Ja5Nuhv4FcB4wRtJRwB+Be4FNJV0oaR9gM+Dh\nwoKtgaTPAb8hfVNbB7gZeJfUMebDwP6SPgFsQrqR/Y2CQq1JlC/KV2aNKl+/rklVyp0InK9PtSWl\nObmOBHa2PSv3ZLwC+Kftg/I3nB+Q3mQX276nwHD7TNL+pFHyf5yXjyB98fgK8A5paK1tSTXmsbZv\nKyjUmkT5onxl1rDy2Y5HP3mQrredA3yqYt3iwAPAjyrWzVd0rDWW7/PAycDginVHAvcBi+flwcAi\nRcca5YvyRfmqe/Tr5r7+QNL6krbLFy6fJPViPD4P3ovtl0mzIi/VsY9bqLOEpBXytUWAu4A1SN/c\nALB9MPBv8qSZtl+0/VrTA61RlC/KV2bNKF8jR0EPBZO0Len6013ADpKeAX4CfAA4W9LBwG3AmsA6\nkuZ36p7fEiR9CTgQeFnSZNJI+HsDl+SeyX906mH0EukbXEuJ8kX5yqxZ5YtrUm1M0qnAVbb/ki9Y\nfpk0ssY3SFOWfBpYhjQk0u627yos2D7K18/+RirLa8AnSeX7BWlW55Pzz4Gke9++ZHtKMdH2XZQv\nyldmzSxf1KTaUL7BUaRpTtYg9a65nTRB5LeBw2yPlXQpsBjwVm4KbCWzganAnbbflPQ48CLwI+BQ\n4OvAaqTusMfYfqioQGsU5YvylVnTyhc1qTajNC7hfPmNsy5pHq2jbV+Ub+DdgHTfwg/c4l3tJZ0L\nLGx7h7y8BGl+sQ/b/nmhwdVBlK+1RfnqIzpOtBGlkd0vBC7L16MeJF2D2k3SV2y/a/smUu3p4wWG\nWhNJn5f0HUk/yKv2BZ6TdDK8d9/bf4DPSFq0qDhrFeWL8pVZUeWLJNUmJK0GHEEak/D3pLbibwAz\ngF8DP5H0U0nfJw2sO7WoWGshaSPSkCpvAV+WdArphsFfAwtK+oukwaSRMxYmjUnYMqJ8Ub4yK7J8\n0dzXJiRtABxre2Re/gwwBrgb+C3pzbMr6TrkOa3USQJA0g+BxWwfJmlB4KfAQqQBce8k/bMMJF2D\n28v2nYUFW4MoX5SvzAotX9E3gMWjrjfTnUtqEx6YlzckzRU1uujY6lC2z+eyrJaXFwSOBn5dsc1C\nwKJFxxrli/JF+er3iOa+FiZphKSRuRYFqUvohsBGkgbZvpF0jWqMpEGFBVqjfKPgArl9+++kkTE+\nK2lZ228ChwPDJX0DwPYbtl8tMOQ+ifJF+cqsLOWLJNWiJH2RNEjsV4GDJZ1s+/fAk8B2pHGyAEya\nbKxlRpEAkLQVcBXpfoszgaVJ5f0ssKWkj9l+g3QDYcvcgNwhyhflK7NSla/oamQ8aqp6DwQuAr6e\nlxcnjTj8h7z8tfyG+jtpSo71i465j+UbmuMemf85DgCeAFYk3TT4K+AfwImkKQDWKDrmPpZvhTYv\nX9v+/Uj3H7b732950nh7pShf4b+QeNT4h0tTvX+907p/A/9XsbwOaVTiwuPtY9kGAr/L/yzz5XU/\nBB4Dhublz5J6L65SdLw1lG8AcGobl0+kb99D2rh8p5NGammr8pGuKy1I6mxVivJF774WImk12w/m\n518DDgK+aPuxvG4p0of7z2zfW1yktZG0CrAkaR6r3wC32z624vWDgNWBfWy/XkyUtZO0DmkYqunA\nz4G7bB9V8Xqrl28j4CO2z8k3ej5k+/CK11u9fFsDqwCnkFoq7rZ9ZMXrrV6+7UgdJI4ndYooR/mK\nztzxqPobztakScLGV6w7gjQ+1ooV68YDGxQdb43lu5vUjPBr0qjJ04GfVGyzMikJt9xUIsBoUhPK\n5aRRQD4BPAoc2OrlI9UsFsvlewDYkTSq/nTgkFYvX459C1JX6y/k5ZXy/17L//1y7CNJ906Oyssr\nkGpOPyy6fDF2XwuQtDDwHeD7pLu5L7S9i+1DJJk0wsRvgA+SRpJ4psBw+yzf03UcsKvt2yWdDnwK\n+Axwi6QBpF6KGwHrk0Zxf6GoePtK0ibACaRZn2+RdDlpeu3tgKskzQYuI5W35crn9An2iqRzSJPb\nbU/qlLUKMF3Sq6TJNTekBcuX35/nAVvZnpxbLGaQvkhd2ep/v2x94AzbV0tagfSl4xDg15LeAq4H\nRlBA+aK5r0VIWhZ4FVgAOA2YZfsr+bXtSRc4P0m6JtVSTX2SNiTdf/GHvPxhUieQLSV9FDiYdKf7\ncGAPt96MwcOAZWzfkP+OtwP35sdrpG+or5D+fmNasHyy7XzD54qkD+xvkzrzfIrUAvAu6RppK5bv\nY6QP6X1I87FdTBpgdQrwMvAR0t/vE8CerVY+AEnfAwbZ/qWkf5N6CT8MbEz60vsoKQk3/e8XSaoF\n5W9y7yUqSWuR/kkecwv+QXNNaVHbL0kaSLpucznpJuQnJa1I+ua6qO0Xi4x1Xkk6BMD2Efn+knVJ\no0Q/IWkJp/HPWlK+prij7aOVphI/mjQKyiH59ZYtn6SPA5eQOhUcSuoYshdz/n6PtXj51iaNHnEH\ncLXtPygNtTYGuMX2pZKWtP18s2OL+6RakNNEYnsDb0p6ELgUeLcVExSA7Xdsv1Sx6iXguZygdiMN\nkjuo1RMUpORk+4j8/AzSt/Cl8nJLfsBVeB1YXdI3STWpI4D1JP0/aO3yOQ0jthVwlO3f5ffs70hN\nmh/K27Ry+e4hTbOxAalmj1MnrQ+TbnGhiAQFMZ9Uy7L9rKS7gFHA520/XnRM9WB7Nun6xhOSjiZd\nsB7jdONgW1Eatf7DwFNFx1IP+UvFY6Rx3b5j+zJJmwKtNldSl2xPkXR/x7KkL5O+YMwoLqq6ugoY\nB4yT9Ghety6pRlyYaO5rUUpzt1xM6n1zd9Hx1IskkUZQvp/0JWrz/I2ubUhagDQz8g+AnVvtGmJP\nJA0lzSd0W16ez3ZLjXbSm/weHQP8mNS82TZ/PwClWbx3IDVt/qHoa2yRpFqYpAVsv1V0HI0gaQww\n2fZ9RcdSb3kcxS2Ah2231JQp1cof5B09/9pKLttI4Kl2/fuVSSSpUEodPcaKjiOEUKxIUiGEEEor\neveFEEIorUhSIYQQSiuSVAghhNKKJBVCCKG0IkmF0AtJH5R0R348lW80vkPSK5JOaWIcH5J0i6Tb\n/n979w9SZRTGcfz7SwjXAqGlsKEIikpz0CAogpagoiQiiQpqjJbmLKLBiKAsiBqqwSWcajBRIoSa\nLCxzaKqxJQhcItGn4ZwbL3qvf+jmveXvs7yH9xzOOXe4PJz7vvd5cr7DYt8eSROS3knaImk832+T\ndLCS18sAAAJdSURBVHuBeZtL48v0nc75Bs1qwhknzBYQEd+AFgBJ3cBkRNyqwVb2k2r8nC/T10VK\n2dMnqbl0MyJGgdE/WPMMKRHuf5EVw/49PkmZLZ0AJO2V9Dy3r0h6ImlE0hdJRyXdlPRB0kBOnIuk\nXZJeSRqV9ELSujmTp5PNS0nvJQ1LWi9pJ9ADHM6nuMbC+HOkGk7XlIoNRqGvuMcmSUOSPkp6mPe5\nNg9tkPQg9w1Kasxpf9qAvnxC+72m2XJxkDKrno3APuAQqf7QUERsJ5WqOJgzTfQCxyKiDXgEXC8z\nTy8pHc0OoA+4ExFjwGVS0cuWiPhRGpwT1T4DLkXEKXIQLaMbGI6IbUA/qbBdySbgbu77nvfYTzqF\nnYyI1uKaZsvFP/eZVUcAAxExLekjqXrpYO4bJ1Vy3QxsBYZz1qAGUt2e2dpJBREhBbsbuS0qByAW\n6INUdPAIQEQMSipm7f5cyAH5Nu93sfOa/TUOUmbV8xMgImYkTRXuz5C+awImImL3Iub6W4Gh0rzF\nHJDTpOSiJU5LYzXjn/vMqmMxQeUT0CSpHVKiWaWqvbO9AU7kdhcwUp0t8ho4ntc+AKyZZ2zp80yS\n6wmZ1YKDlNnSReFarg1zTx8REVNAJ9AjaYxUBbWjzPwXgLO5XlgXcLHCGpX2Val9FTiQXzfvBL6S\nglDZ/ebrY+C+X5ywWnGCWbMVQtJqYDo/N+sA7kVEa633ZTYfP5MyWzk2AE8lrSI9Pyv3fyuzuuKT\nlJmZ1S0/kzIzs7rlIGVmZnXLQcrMzOqWg5SZmdUtBykzM6tbDlJmZla3fgFZlU67nzHtSAAAAABJ\nRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fde671603c8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(6, 5))\n",
    "plt.plot(tof_range, res_numba, label=\"Numba\")\n",
    "plt.plot(tof_range, res_fortran, label=\"Fortran\")\n",
    "plt.plot(tof_range, res_python, label=\"Python\")\n",
    "plt.legend()\n",
    "plt.ylim(0)\n",
    "plt.xlabel(\"Time of flight\")\n",
    "plt.xticks(rotation=45)\n",
    "plt.ylabel(\"Computation time\")\n",
    "plt.title(\"Near-parabolic orbit ($e = {:.3f}$)\".format(ss.ecc))\n",
    "plt.tight_layout()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Hyperbolic orbit"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[   2400.           36342.85714286   70285.71428571  104228.57142857\n",
      "  138171.42857143  172114.28571429  206057.14285714  240000.        ]\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "(array([-25000., -20000., -15000., -10000.,  -5000.,      0.,   5000.,\n",
       "         10000.]), <a list of 8 Text xticklabel objects>)"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fde6740f828>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "ss = State.from_vectors(Earth, r0, v0 * 1.8)\n",
    "tof_range = np.linspace(tof.to(u.s).value,\n",
    "                        100 * tof.to(u.s).value,\n",
    "                        num=8)\n",
    "print(tof_range)\n",
    "plot(ss)\n",
    "plt.xticks(rotation=65)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "100000 loops, best of 3: 12.1 µs per loop\n",
      "100000 loops, best of 3: 13.3 µs per loop\n",
      "10000 loops, best of 3: 56.5 µs per loop\n",
      "100000 loops, best of 3: 11.7 µs per loop\n",
      "100000 loops, best of 3: 12.9 µs per loop\n",
      "10000 loops, best of 3: 47.1 µs per loop\n",
      "100000 loops, best of 3: 11.9 µs per loop\n",
      "100000 loops, best of 3: 13 µs per loop\n",
      "10000 loops, best of 3: 46.8 µs per loop\n",
      "100000 loops, best of 3: 11.6 µs per loop\n",
      "The slowest run took 4.02 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 12.8 µs per loop\n",
      "10000 loops, best of 3: 47.1 µs per loop\n",
      "The slowest run took 6.14 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 11.5 µs per loop\n",
      "100000 loops, best of 3: 13.2 µs per loop\n",
      "10000 loops, best of 3: 48.5 µs per loop\n",
      "100000 loops, best of 3: 11.9 µs per loop\n",
      "The slowest run took 4.28 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 13.2 µs per loop\n",
      "10000 loops, best of 3: 47.7 µs per loop\n",
      "100000 loops, best of 3: 12.1 µs per loop\n",
      "The slowest run took 4.15 times longer than the fastest. This could mean that an intermediate result is being cached \n",
      "100000 loops, best of 3: 13 µs per loop\n",
      "10000 loops, best of 3: 49.4 µs per loop\n",
      "100000 loops, best of 3: 11.6 µs per loop\n",
      "100000 loops, best of 3: 13.3 µs per loop\n",
      "10000 loops, best of 3: 49.3 µs per loop\n"
     ]
    }
   ],
   "source": [
    "res_fortran = []\n",
    "res_numba = []\n",
    "res_python = []\n",
    "r0_ = ss.r.to(u.km).value\n",
    "v0_ = ss.v.to(u.km / u.s).value\n",
    "for tof_ in tof_range:\n",
    "    timeit_res_fortran = %timeit -o propagation.kepler(k_, r0_, v0_, tof_)\n",
    "    timeit_res_numba = %timeit -o kepler_numba(k_, r0_, v0_, tof_, numiter=1000)\n",
    "    timeit_res_python = %timeit -o kepler_python_final(k_, r0_, v0_, tof_)\n",
    "    res_fortran.append(timeit_res_fortran.best)\n",
    "    res_numba.append(timeit_res_numba.best)\n",
    "    res_python.append(timeit_res_python.best)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\nATYjVUVtRqqmGgf8q2F6oGH5YUbahSF9fyaw4j2jrUg1FIvpC0L1wejhcjI7/DhIdUHlg1SN9N/A\n4cBORNxadnasRNJapODTbNqAdI/kjobpGeAFwHpNptr6NegLXI0BrFlwe7BSLVBTt2f1paLafLBi\nFV2aj3iwpJyOGA5SXTBsghSAtD+pAcl0D/UxgvX9+m8ViJ4D/IOVA9EdwJ2k3loG876r0Rew+gto\n6wHrAI/QumS2cmCLWDyovK2Yz7VZ+Z7RVsBqrHzP6Cbg/hFXQqwIB6kuGFZBCkB6N6mvw/cQ8X9l\nZ8cGSRoDbMzKAWhzUvXcYvoCzzxWDET3VeKimxr3rEvnQW094GnaVznWT4+xcou6lwLPI7XmrQ9I\nNwELK3FeeoiDVBcMuyAFIL0VOAfYj4jLy86OtSCtQbrI1geg2vwk4D6al4buIOKRMrJcqFRCXIvO\nA9rzgH+yciOGu9wjSzU4SHXBsAxSANLrSA80H0bEBWVnpyeli+66rBh86qd1SM/0NQahecB8P6ht\nw52DVBcM2yAFIL2C9ADeD0gXw8V5eqpuvtXy00Q82/1MV0B6FmY8sHrda6v5xnVrsWLpCFaujqtN\nC/yL30YyB6kuGNZBCkCaTOpiag1WvLCO72B5KZ0HtaFcXkzEs7kkMpb2QaLT4DGQ+bENeXtqAPOP\nk6qgaoHo374PYr3KQaoLhn2QGqwVA0SnQW0wy63SPEvqiuVZBhcsVmX+aQcWs1XnINUFPRukytQX\nIJdV6jkbMxuQIq+fRfaCbtZe+oX0TNnZMLPqKnJkXjMzs1XiIGVmZpXlIGVmZpXlIGVmZpXlIGVm\nZpXlIGVmZpXlIGVmZpXlIGVmZpXlIGVmZpXlIGVmZpXlIGVmZpXlIGVmZpXlIGVmZpXlIGVmZpXl\nIGVmZpXlIGVmZpXlIGVmZpXlIGVmZpXlIGVmZpXlIGVmZpXlIGVmZpXlIGVmZpXlIGVmZpXlIGVm\nZpVVaJCSNE3SrZJul3RkizQn5e03SNq6v30lrStplqTbJF0pae26bUfn9LdK2qnJe10i6W9D/TnN\nzKwYhQUpSaOBk4FpwBRgb0lbNqSZDmweEZOBg4FTOtj3KGBWRGwBXJWXkTQF2DOnnwZ8W9Kouvd6\nN/AYEIV8YDMzG3JFlqS2BeZFxPyIWAKcB8xoSLMbcCZARFwDrC1p/X72Xb5Pfn1nnp8BnBsRSyJi\n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\ne0E3MzMrhYOUmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOU\nmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlV\nloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlV1piyM1BFEn8EXgwsztNTdfON01Bu\nWxpBdOMz2vAjIWA8sHqe1qibX73D9cP1O78UeAZY0uK13bYBvUbwbLc+VKP8Nx5H+juvlqfxDa9D\nva5x21sj+GvhH7ZDivA1EUBSRITSPM8lfaHHt5hWL2j9KFYt+D1T+zj9vHaSplv7ACwDns3T0n5e\nS0sTwbK6PNcuKKsx+IAx0LSrkf7GT+Xpybr5pzpY/xR9/yPDiUjBdRwwtuDXcfk9hyLowcADSO1v\n/DTpO13/2um6wW6rzT8SwdL+/ij16q+fQ81BKivyJHeeB8bQ9087mIA3DpaXxPp77SRNt/YZRboI\njc7TmH5ey0hTK4HUglaQ/lZLaB0YBhpE+lu/uDFQ2tCTGM3QBD0x8ODxzHD8GztIdUEVgpRVm8Qo\n+oKWgKfLrBoyq4oir5/DtX7arOvyL9xlpNKTmXWBg1QTOk7HAy8gVbM80eK13banYqaLqGZl03ES\nqeqt/p7TUN6/apcmgEdbTI81WfeErxsrc3VftkLDieO0K7A+6Yb1cxpem61r3LYaffcSWgWyToJd\nyzQxMwb1az5/aUfT9yWrn8aWtH4pKzYIGehrv2liZgy7ev6RQMdpFH2NPxq/P82mVtsGG2DGMESt\n/gbxOhp4LrBW3WuzqbZtdeBxOg9qrbY9FjOjqw1kfE+qC4byJOcvZquA1kmQ62TbMlYOZM/Q/Fde\n4/Qsfc12G5vvdrp+MPs0W7+E9GWuNQhZ1ddW65YwyADX4vXpfB6XFfjaNs2q/urWcRpD62DRXzDp\nNNg0+8HWbGq17Qn6WiV2Ehga1y0dLqWT/PdYk+YBrFVgazUtoXVg62/9zTEznhhQ3h2kijecGk7U\nVWE0BrJxdBAoeq1Ukc/XOFYt0DVLU2tIUcRrJ2lg4IGvPjCNobMgMZD1jdsWD5cgMVLk//fxDDy4\n1bbtHzNj7oDe00GqeMMpSJnB8hL7QAPgEupK3g4gNhQcpLrAQcrMbHCKvH4W3nefpGmSbpV0u6Qj\nW6Q5KW+/QdLW/e0raV1JsyTdJulKSWvXbTs6p79V0k51678o6S5JjxX1Wc3MbGgVGqQkjQZOBqYB\nU4C9JW3ZkGY6sHlETAYOBk7pYN+jgFkRsQVwVV5G0hRgz5x+GvBtSbXofjGwbUEf1czMClB0SWpb\nYF5EzI+IJcB5wIyGNLsBZwJExDXA2pLW72ff5fvk13fm+RnAuRGxJCLmA/OA1+Zjz4mI+wr4jGZm\nVpCig9SGwN11y/fkdZ2kmdhm3wkRsSjPLwIm5PmJOV279zMzs2Gi6B4nOm2V0ckNNzU7XkSEpHbv\n03HLEEnH1i3OjojZne5rZtYrJE0FpnbjvYoOUguASXXLk1ixpNMszUY5zdgm6xfk+UWS1o+I+yRt\nANzf5lgL6FBEHNtpWjOzXpV/wM+uLUuaWdR7FV3ddy0wWdImksaRGjVc0pDmEmA/AEnbAQ/nqrx2\n+14C7J/n9wcuqlu/l6RxkjYFJgNzivloZmZWtEJLUhGxVNJhwBWkBwlPj4hbJB2St58aEZdKmi5p\nHulJ9QPb7ZsPfTxwvqSDgPnAHnmfuZLOB+aS+oM7NPKDYJK+AuwNrC7pbuC7EfG5Ij+/mZmtGj/M\nm/lhXjOzwRnWD/OamZkNloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlV\nloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOU\nmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlV\nloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlVloOUmZlVVqFB\nStI0SbdKul3SkS3SnJS33yBp6/72lbSupFmSbpN0paS167YdndPfKmmnuvWvlvS3vO2bRX1eMzMb\nWoUFKUmjgZOBacAUYG9JWzakmQ5sHhGTgYOBUzrY9yhgVkRsAVyVl5E0Bdgzp58GfFuS8j6nAAfl\n95ksaVoxn3rkkDS17DxUhc9FH5+LPj4X3VFkSWpbYF5EzI+IJcB5wIyGNLsBZwJExDXA2pLW72ff\n5fvk13fm+RnAuRGxJCLmA/OA10raAHhuRMzJ6X5Yt4+1NrXsDFTI1LIzUCFTy85AhUwtOwO9oMgg\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fde66fdeef0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(6, 5))\n",
    "plt.plot(tof_range, res_numba, label=\"Numba\")\n",
    "plt.plot(tof_range, res_fortran, label=\"Fortran\")\n",
    "plt.plot(tof_range, res_python, label=\"Python\")\n",
    "plt.legend(loc=5)\n",
    "plt.ylim(0)\n",
    "plt.xlabel(\"Time of flight\")\n",
    "plt.xticks(rotation=45)\n",
    "plt.ylabel(\"Computation time\")\n",
    "plt.title(\"Hyperbolic orbit ($e = {:.3f}$)\".format(ss.ecc))\n",
    "plt.tight_layout()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div class=\"alert alert-success\"><strong>Conclusion</strong>: I can achieve 90 % of Fortran speed with pure Python using a JIT compiler like numba. This allows me not only to quickly prototype algorithms and iterate fast between versions, while obtaining excellent performance, unseen in a dynamic language like Python.</div>"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
